package com.ifengxue.ioc.classloader;

import javax.annotation.Nonnull;
import java.lang.annotation.Annotation;
import java.util.List;
import java.util.Map;

public interface BeanClassLoader {
    /**
     * 添加感兴趣的注解
     * @param clazz
     * @param <A>
     */
    default <A extends Annotation> void addInterestedAnnotation(@Nonnull Class<A> clazz) {
        addInterestedAnnotations(clazz);
    }

    /**
     * 添加感兴趣的注解
     * @param classes
     * @param <A>
     */
    <A extends Annotation> void addInterestedAnnotations(Class<A>...classes);

    /**
     * 添加基础扫描的包
     * @param packageName
     */
    default void addBasePackage(@Nonnull String packageName) {
        addBasePackages(packageName);
    }

    /**
     * 添加基础扫描的包
     * @param packageNames
     */
    void addBasePackages(String...packageNames);

    /**
     * 添加类搜索路径
     * @param path
     */
    default void addSearchPath(@Nonnull String path) {
        addSearchPaths(path);
    }

    /**
     * 添加类搜索路径
     * @param paths
     */
    void addSearchPaths(String...paths);

    /**
     * 从<code>classpath</code>和{@link #addSearchPath(String)},{@link #addSearchPaths(String...)}下
     * 搜索包名以{@link #addBasePackage(String)},{@link #addBasePackages(String...)}为前缀，并添加了
     * 指定注解的所有类文件
     * @return key:为指定的注解,value:为声明了指定注解的类;如果一个类声明了多个感兴趣的注解，则在Map中会重复出现
     */
    @Nonnull
    Map<Class<? extends Annotation>, List<Class<?>>> findInterestedClasses();
}
